package com.newtouch.mark.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.newtouch.mark.exception.NotDirectoryException;

/**
 * 搜索指定目录下的文件 可以根据条件搜索该目录下的相关文件 注：要查找的文件必须是一个带扩展名。
 *
 * @author 11710
 * @version 1.0.0 2012/04/19
 */
public class SearchFileInDirectory {
    private List<File> listFile = null;

    /**
     * 初始化实例，path默认指定一个文件路径.
     *
     * @param path 文件路径
     */
    public SearchFileInDirectory(File path) {
        if (path == null || !path.isDirectory()) {
            throw new NotDirectoryException("It's not a Directory or is null.");
        }
        listFile = getAllFiles(path);
    }

    /**
     * 在指定目录路径下，查找指定的文件,否则返回null.
     *
     * @param fileName 文件名
     * @return 返回找到的文件类型,若无返回null.
     */
    public File getFileByFullName(String fileName) {
        if (fileName == null) {
            throw new NullPointerException("The fileName is Null");
        }
        for (File file : listFile) {
            if (fileName.equals(file.getName())) {
                return file;
            }
        }
        return null;
    }

    /**
     * 据文件名，查找所有该类型文件,否则返回null
     *
     * @param name 文件名
     * @return 回所有指定的名称的文件
     */
    public List<File> getFileByName(String name) {
        if (name == null) {
            return listFile;
        }
        List<File> condFile = new ArrayList<File>();

        for (File file : listFile) {
            if (isCondName(file, name)) {
                condFile.add(file);
            }
        }
        return condFile;
    }

    /**
     * 根据扩展名，查找所有该类型文件,否则返回null
     *
     * @param ext
     * @return 返回所有指定的类型的文件
     */
    public List<File> getFileByType(String ext) {
        if (ext == null) {
            return listFile;
        }
        List<File> condFile = new ArrayList<File>();

        for (File file : listFile) {
            if (isCondType(file, ext)) {
                condFile.add(file);
            }
        }

        return condFile;

    }

    /**
     * 设置收索路径
     *
     * @param path 收索路径
     */
    public void setPath(File path) {
        this.listFile = getAllFiles(path);
    }

    /**
     * 判断文件名是否是指定的文件名
     *
     * @param file 文件名
     * @param name 扩展名
     * @return 如是，返回true.否则返回false.
     */
    protected boolean isCondName(File file, String name) {
        String fileName = file.getName();
        int tag = fileName.lastIndexOf(".");
        if (tag != -1) {
            fileName = fileName.substring(0, tag);
        }
        if (name.equals(fileName)) {
            return true;
        }
        return false;

    }

    /**
     * 判断文件名是否是指定的扩展名
     *
     * @param file 文件名
     * @param ext 扩展名
     * @return 如是，返回true.否则返回false.
     */
    protected boolean isCondType(File file, String ext) {
        String fileName = file.getName();
        int tag = fileName.lastIndexOf(".");
        if (tag == -1) {
            return false;
        }
        String str = fileName.substring(tag + 1);
        if (ext.equalsIgnoreCase(str)) {
            return true;
        }
        return false;

    }

    /**
     * 得到指定目录下的所有文件
     *
     * @param filePath 指定的目录
     * @return 指定目录下的所有文件
     */
    private List<File> getAllFiles(File filePath) {
        List<File> listFile = new ArrayList<File>();
        searchAllFiles(filePath, listFile);

        return listFile;
    }

    /**
     * 搜索文件： 搜索指定目录下的所有文件 采用迭代方式进行文件搜素
     *
     * @param path 要搜索的目录
     * @param arrayList 存储搜索到的所有文件
     */
    private void searchAllFiles(File path, List<File> listFiles) {
        File[] fileList = null;
        if (path.isDirectory()) {
            fileList = path.listFiles();
            for (File fil : fileList) {
                searchAllFiles(fil, listFiles);
            }
        }
        if (path.isFile()) {
            listFiles.add(path);
        }
    }/** 
    **/

}